package com.lxj.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lxj.domain.ProdPropValue;
import com.lxj.mapper.ProdPropValueMapper;
import com.lxj.service.ProdPropValueService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lxj.mapper.ProdPropMapper;
import com.lxj.domain.ProdProp;
import com.lxj.service.ProdPropService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

/**
 * @author lxj
 * @date 2021/8/1 11:11
 * @Description: 
 */
@Service
@Slf4j
public class ProdPropServiceImpl extends ServiceImpl<ProdPropMapper, ProdProp> implements ProdPropService{

    @Autowired
    private ProdPropMapper prodPropMapper;

    @Autowired
    private ProdPropValueMapper prodPropValueMapper;

    @Autowired
    private ProdPropValueService prodPropValueService;

    /**
     * 分页查询属性和属性值
     *
     * @param page
     * @param prodProp
     * @return
     */
    @Override
    public Page<ProdProp> loadProdPropPage(Page<ProdProp> page, ProdProp prodProp) {
        //先查询属性的分页
        Page<ProdProp> prodPropPage = prodPropMapper.selectPage(page, new LambdaQueryWrapper<ProdProp>()
                .like(StringUtils.hasText(prodProp.getPropName()), ProdProp::getPropName, prodProp.getPropName())
        );
        List<ProdProp> prodProps = prodPropPage.getRecords();
        if(CollectionUtils.isEmpty(prodProps)){
            // 属性都是空的  直接返回
            return prodPropPage;
        }
        //拿到当前查询出来的属性的id的集合
        List<Long> prodIds = prodProps.stream().map(ProdProp::getPropId).collect(Collectors.toList());
        //再去查询属性值的表
        List<ProdPropValue> prodPropValues = prodPropValueMapper.selectList(new LambdaQueryWrapper<ProdPropValue>()
                .in(ProdPropValue::getPropId, prodIds)
        );
        // 循环属性
        prodProps.forEach(prodProp1 -> {
            // 过滤属性值 找到prop-id 相同的
            List<ProdPropValue> propValues = prodPropValues.stream().filter(prodPropValue -> prodPropValue.getPropId().equals(prodProp1.getPropId()))
                    .collect(Collectors.toList());
            prodProp1.setProdPropValues(propValues);
        });
        return prodPropPage;
    }

    /**
     * 新增属性和属性值
     *
     * @param prodProp
     * @return
     */
    @Override
    @Transactional
    public boolean save(ProdProp prodProp) {
        log.info("新增属性和属性值{}", JSON.toJSONString(prodProp));
        prodProp.setRule(2);
        prodProp.setShopId(1L);
        int i = prodPropMapper.insert(prodProp);
        if(i > 0){
            // 新增属性值
            List<ProdPropValue> prodPropValues = prodProp.getProdPropValues();
            // 循环属性值集合 设置对应的属性id
            prodPropValues.forEach(prodPropValue -> prodPropValue.setPropId(prodProp.getPropId()));
            // 插入数据库
            prodPropValueService.saveBatch(prodPropValues);
        }
        return i > 0;
    }
}
